/*
Go语言与Java一样也有垃圾回收，可以不用担心内存的分配与回收问题
Go语言中存在两个内存分配的原语：new和make
他们作用于不同的类型，做不同的工作，虽然有点绕口但使用规则很简单

用new分配内存
内建函数new本质上说跟其它语言的同名函数一样：new(T)分配了零值填充了
T类型的内存空间，并返回其地址，一个*T类型的值。用Go的话术说，他返回了一个指针，
指向新分配的类型T的零值。很重要
这意味着使用者可以用new创建一个数据结构的实例并且可以直接工作。如
bytes.Buffer的文档描述的“Buffer的零值是一个准备好的空缓存。“类似的。
sync.Mutex也没有明确的构造函数或init方法。取而代之，sync.Mutex的零值
被定义为非锁定的互斥量。
零值非常有用

用make分配内存
内建函数make(T, args)与new(T)有不同的功能。他只是创建slice、map、channel，
并且返回一个有初始值（非零）的T类型，而不是*T。本质来说，导致这三个类型有所不同的原因是
指向数据结构的引用在使用前必须被初始化。
例如，一个slice，是一个包含指向数据（内部array）的指针，长度和容量的三项描述符；在这些项目
被初始化之前，slice为nil。对于slice，map和channel，make初始化了内部的数据结构，填充适当的值
再比如，make([]int,10,100)，分配了100个整数的数组array，然后用长度10和容量100创建了
slice结构指向这个100个整数的数组的前十个元素。区别就是，new(int[])返回指向新分配的内存的指针，
而零值填充的slice结构是指向nil的slice值

一定要注意，make只适用于slice、map、channel，并且返回地不是指针。而new可以得到特定的开辟内存之后的对象指针

new分配；make初始化
再简单总结就是
	- new(T)返回的是*T指针，指向一个空值nil的T
	- make(T)返回初始化后的T
还是要强调，make只适用与map、slice、channel

*/

package main

import (
	"bytes"
	"os"
	"sync"
)

func main() {
	//p := new(SyncBuffer)//用new函数为结构体开辟内存，p已经可以使用了
	//fmt.Println(p)
	var p *[]int = new([]int)      //返回创建的数组的指针
	var v []int = make([]int, 100) //返回一个数组

	//以下两种更常见
	a := new([]int)
	b := make([]int, 100)

}

type SyncBuffer struct {
	lock sync.Mutex //{0 0}

	buffer bytes.Buffer //{[] 0 0}

}

func testStrut(fd int, name string) *File {
	f := File{fd, name, nil, 0}
	return &f
}
